From 7a2b6e131ccd2dabf8c022229bd54f65ce4e1c80 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sun, 5 Jun 2005 14:56:51 +0000 Subject: [PATCH] bitkeeper revision 1.1677 (42a312b3NoXLv1fa_qVHaQXgt_JhLw) Fix smp_call_function race (introduced a couple of days ago). Signed-off-by: Keir Fraser --- xen/arch/x86/smp.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c index 5a8f6de6f0..b0782ec5d7 100644 --- a/xen/arch/x86/smp.c +++ b/xen/arch/x86/smp.c @@ -272,6 +272,7 @@ void smp_send_event_check_mask(cpumask_t mask) struct call_data_struct { void (*func) (void *info); void *info; + int wait; atomic_t started; atomic_t finished; }; @@ -299,6 +300,7 @@ int smp_call_function( data.func = func; data.info = info; + data.wait = wait; atomic_set(&data.started, 0); atomic_set(&data.finished, 0); @@ -345,17 +347,22 @@ asmlinkage void smp_event_check_interrupt(void) asmlinkage void smp_call_function_interrupt(void) { - void (*func) (void *info) = call_data->func; + void (*func)(void *info) = call_data->func; void *info = call_data->info; ack_APIC_irq(); perfc_incrc(ipis); - mb(); - atomic_inc(&call_data->started); - - (*func)(info); - - mb(); - atomic_inc(&call_data->finished); + if ( call_data->wait ) + { + (*func)(info); + mb(); + atomic_inc(&call_data->finished); + } + else + { + mb(); + atomic_inc(&call_data->started); + (*func)(info); + } } -- 2.30.2